package com.tom;

import cn.hutool.core.util.StrUtil;
import com.tom.model.Student;
import com.tom.model.User;

import java.net.http.HttpClient;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;


/**
 * jdk10
 * var 声明变量  虽然我们在代码中使用 var 进行了定义，但其实虚拟机不认识这个 var，在 Java 文件编译成 class 文件的过程中，会进行解糖，使用变量真正的类型来替代 var
 *
 * HTTP 客户端 API-响应式流实现的 HttpClient
 *
 * Collectors.teeing()收集器
 *
 *
 * switch 语句以便它可以用作语句或表达式。不必为 break 的每个 case 块定义一个语句，我们可以简单地使用箭头语法。
 *
 *
 */
public class Test10 {


    public static void main(String[] args) {

        //var是语法糖，最后编译还是Student类
        var student = new Student();
        student.setAge(13);
        student.setName("aa");
        System.out.println(student);



        List<Student> list = Arrays.asList(        new Student("唐一", 55),        new Student("唐二", 60),        new Student("唐三", 90));

        //Collectors.teeing()   收集器


        //平均分 总分
        String result = list.stream()
                .collect(
                        Collectors.teeing(
                                Collectors.averagingInt(Student::getAge),
                                Collectors.summingInt(Student::getAge),
                                (s1, s2) -> s1 + ":" + s2));


        System.out.println(StrUtil.format("平均分 总分：{}",result));
        //最低分  最高分
        String result2 = list.stream()
                .collect(
                        Collectors.teeing(
                                Collectors.minBy(Comparator.comparing(Student::getAge)),
                                Collectors.maxBy(Comparator.comparing(Student::getAge)),
                                (s1, s2) -> s1.orElseThrow() + ":" + s2.orElseThrow()));
        System.out.println(StrUtil.format("最低分 最高分：{}",result2));


        //tolist JDK15
        List<Student> list2 = Stream.of(        new Student("唐一", 55),        new Student("唐二", 60),        new Student("唐三", 90))
                .toList();

        //switch 语句以便它可以用作语句或表达式。不必为 break 的每个 case 块定义一个语句，我们可以简单地使用箭头语法。

        int size = 3;
        String cn = switch (size) {    case 1 -> "壹";    case 2 -> "贰";    case 3, 4 -> "叁";    default -> "未知";};
        System.out.println(cn);//要使用此预览功能，我们必须在应用程序启动期间使用–enable-preview标志明确指示 JVM。



        //JDK13 使用 yield，可以有效地从 switch 表达式返回值，并能够更容易实现策略模式
        var me = 4;
        var operation = "平方";
        var result3 = switch (operation) {
            case "加倍" -> {
                yield me * 2;
            }
            case "平方" -> {
                yield me * me;
            }
            default -> me;
        };


        System.out.println(result3);



        String json = """ 
                    {     
                        "name" : "Baeldung",     
                        "website" : "https://www.alibaba.com/" 
                    } 
                    """;
        System.out.println(json);


        Object av="String";
        if(av instanceof String t){
            System.out.println(t);
        }


        User aa = new User("aa", 15);
        System.out.println(aa);
    }
}
